// app/middleware/rate_limit_middleware.js
'use strict';

const RATE_LIMIT_WINDOW = 60 * 1000; // 1分钟
const RATE_LIMIT_MAX = 100; // 每分钟最多100次请求

// 存储请求计数的内存存储（在生产环境中应使用Redis）
const requestCounts = new Map();

module.exports = (options, app) => {
  return async function rateLimitMiddleware(ctx, next) {
    const clientIP = ctx.ip;
    const currentTime = Date.now();
    const windowStart = currentTime - RATE_LIMIT_WINDOW;
    
    // 获取当前IP的请求记录
    let ipRecord = requestCounts.get(clientIP);
    if (!ipRecord) {
      ipRecord = {
        requests: [],
        blockedUntil: 0
      };
      requestCounts.set(clientIP, ipRecord);
    }
    
    // 检查是否被阻止
    if (ipRecord.blockedUntil > currentTime) {
      ctx.status = 429;
      ctx.body = {
        code: 429,
        message: '请求过于频繁，请稍后再试'
      };
      return;
    }
    
    // 清理过期的请求记录
    ipRecord.requests = ipRecord.requests.filter(timestamp => timestamp > windowStart);
    
    // 检查是否超过限制
    if (ipRecord.requests.length >= RATE_LIMIT_MAX) {
      // 阻止该IP一段时间
      ipRecord.blockedUntil = currentTime + 5 * 60 * 1000; // 阻止5分钟
      ctx.status = 429;
      ctx.body = {
        code: 429,
        message: '请求过于频繁，IP已被临时阻止'
      };
      return;
    }
    
    // 记录当前请求
    ipRecord.requests.push(currentTime);
    
    // 设置响应头
    ctx.set('X-RateLimit-Limit', RATE_LIMIT_MAX);
    ctx.set('X-RateLimit-Remaining', RATE_LIMIT_MAX - ipRecord.requests.length - 1);
    ctx.set('X-RateLimit-Reset', new Date(windowStart + RATE_LIMIT_WINDOW).toUTCString());
    
    await next();
  };
};